﻿#pragma once

#include <breaking/base/define.h>

namespace breaking
{
	/**
	 * @brief 时间类, 精确到ms
	 */
	class time
	{
	public:
		//每秒毫秒数
		const static uint32_t MSECS_OF_SEC = 1000;
		//每分秒数
		const static uint32_t SECS_OF_MIN = 60;
		//每小时秒数
		const static uint32_t SECS_OF_HOUR = (60 * SECS_OF_MIN);
		//每日秒数
		const static uint32_t SECS_OF_DAY = (24 * SECS_OF_HOUR);
		//每日毫秒数
		const static uint32_t MSECS_OF_DAY = (SECS_OF_DAY * MSECS_OF_SEC);

	public:
		time();
		time(uint64_t msec);
		time(const time& _time);
		~time();

	public:
		/**
		 *@brief 获取当前时间
		 */
		static time current_time();

		/**
		*@brief 设置时间偏移(传入调整后时间的时间戳)
		*/
		static void set_current_time_deviation(uint64_t new_current_time);

		/**
		*@brief 设置时间偏移（直接设置偏移）
		*/
		static void set_time_deviation(int64_t deviation);

		/**
		 * @brief 获取时间偏移
		 * @return
		 */
		static int64_t get_time_deviation();

		/**
		 *@brief 获取毫秒数
		 */
		uint64_t msec() const;

		/**
		 *@brief 获取秒数
		 */
		uint32_t sec() const;

#pragma region 操作符重载

		//逻辑操作符重载
		bool operator<(const time& _time) const;
		bool operator>(const time& _time) const;
		bool operator>=(const time& _time) const;
		bool operator<=(const time& _time) const;
		bool operator==(const time& _time) const;
		bool operator!=(const time& _time) const;

		//算术操作符重载
		const time& operator+= (const time& _time);
		const time& operator-= (const time& _time);

#pragma endregion

	private:
		// 时间偏移(ms,相对于当前时间，大于0表示当前时间往后加，小于0表示当前时间往前减)
		static int64_t		s_current_time_deviation;

		//1970年1月1日0时到现在的毫秒数
		uint64_t			m_millisecond;
	};
}